<!DOCTYPE HTML>
<html>
<head>
  <title>Test for recursive CPOW-getting-cookie bug</title>
  <script type="application/javascript"
          src="/tests/SimpleTest/SimpleTest.js">
  </script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
</head>
<body>

  <script type="application/javascript;version=1.8">
    "use strict";

    SimpleTest.waitForExplicitFinish();

    const childFrameURL =
      "http://mochi.test:8888/tests/dom/ipc/tests/file_bug1086684.html";

    function childFrameScript() {
      "use strict";

      let { MockFilePicker } =
        Components.utils.import("chrome://specialpowers/content/MockFilePicker.jsm", {});

      function parentReady(message) {
        MockFilePicker.init(content);
        MockFilePicker.returnFiles = [message.data.file];
        MockFilePicker.returnValue = MockFilePicker.returnOK;

        let input = content.document.getElementById("f");
        input.addEventListener("change", () => {
          MockFilePicker.cleanup();
          let value = input.value;
          message.target.sendAsyncMessage("testBug1086684:childDone", { value });
        });

        input.focus();
        input.click();
      }

      addMessageListener("testBug1086684:parentReady", function(message) {
        parentReady(message);
      });
    }

    let test;
    function* testStructure(mm) {
      let value;

      function testDone(msg) {
        test.next(msg.data.value);
      }

      mm.addMessageListener("testBug1086684:childDone", testDone);

      let blob = new Blob([]);
      let file = new File([blob], "helloworld.txt", { type: "text/plain" });

      mm.sendAsyncMessage("testBug1086684:parentReady", { file });
      value = yield;

      // Note that the "helloworld.txt" passed in above doesn't affect the
      // 'value' getter. Because we're mocking a file using a blob, we ask the
      // blob for its path, which is the empty string.
      is(value, "", "got the right answer and didn't crash");

      SimpleTest.finish();
    }

    function runTests() {
      info("Browser prefs set.");

      let iframe = document.createElement("iframe");
      SpecialPowers.wrap(iframe).mozbrowser = true;
      iframe.id = "iframe";
      iframe.src = childFrameURL;

      iframe.addEventListener("mozbrowserloadend", function() {
        info("Got iframe load event.");
        let mm = SpecialPowers.getBrowserFrameMessageManager(iframe);
        mm.loadFrameScript("data:,(" + encodeURI(childFrameScript.toString()) + ")();",
                           false);

        test = testStructure(mm);
        test.next();
      });

      document.body.appendChild(iframe);
    }

    addEventListener("load", function() {
      info("Got load event.");

      SpecialPowers.addPermission("browser", true, document);
      SpecialPowers.pushPrefEnv({
        "set": [
          ["dom.ipc.browser_frames.oop_by_default", true],
          ["dom.mozBrowserFramesEnabled", true],
          ["network.disable.ipc.security", true],
          ["browser.pagethumbnails.capturing_disabled", true]
        ]
      }, runTests);
    });
  </script>
</body>
</html>
